#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
from .ZhongQiDataApi import read_from_zq
import pymongo
from py_at.Bar import *
from py_at.Statistics import Statistics
from datetime  import datetime
import os
import pickle as pkl
from .HaiFengDataApi import read_bars

def read_data_test(self, stra):
    """取历史K线数据,并执行策略回测"""
    # 取数据
    stra.EnableOrder = False
    ddoc = []
    # if stra.Backtest=="True":  #如果是回测      以后可以扩展出来如果是回测的话加载mongon数据
    #     #ddoc = self.readloadPkl(stra)   #那么读取本地数据  这个使用的是pkl格式存取的数据这个也比较意思
    #     ddoc = self.readloadMongoData(stra)  #这个是读取本地数据  使用的是MongoData方式
    #     lasttime = "{0} {1}".format(ddoc[ddoc.count() - 1]['date'], ddoc[ddoc.count() - 1]['time'])
    # else:
    ddoc = readnetwork(stra) #读取远程数据 数据源可选海风 和 中期
    lasttime = ddoc[-1]['_id']
    # print params os strategy
    # stra.OnOrder = self.on_order    # 这个地方 用于订单回调data 没有实现  ma也没有实现 但是这里上面赋值了 所以这个地方会回调 移动到下面了
    print('开始加载策略%s 策略类型 %s' %(stra.ID,stra.Comment))
    # for p in stra.Params:
    #     print("参数为{0}:{1}".format(p, stra.Params[p]))
    #lasttime= ddoc[-1]['_id']

    for doc in ddoc:
        if doc.get('High'):
            bar = Bar(doc["_id"], doc["High"], doc["Low"], doc["Open"], doc["Close"], doc["Volume"],
                      doc["OpenInterest"],doc['TradingDay'])
        # else:
        #     bar = Bar(doc["datetime"], doc["high"], doc["low"], doc["open"], doc["close"], doc["volume"],
        #               doc["openInterest"],doc['date'])
        for data in stra.Datas:
            #data.__new_min_bar__(bar)  # 调Data的onbar   用1分钟数据的时候使用这个   否则使用下面的

            data.Bars = np.append(data.Bars, bar)                        #对数据进行初始化填充
            data.D = np.append(data.D, bar.D)
            data.H = np.append(data.H, bar.H)
            data.L = np.append(data.L, bar.L)
            data.O = np.append(data.O, bar.O)
            data.C = np.append(data.C, bar.C)
            data.V = np.append(data.V, bar.V)
            data.I = np.append(data.I, bar.I)
            date = bar.TD  # 原来是用真实日期做的HighD  现在更改为交易日期
            if len(data.DateD) == 0 or data.DateD[0] != date:
                data.DateD.insert(0, date)
                data.OpenD.insert(0, bar.O)
                data.HighD.insert(0, bar.H)
                data.LowD.insert(0, bar.L)
                data.CloseD.insert(0, bar.C)
            else:  # 如果还是当前天 那么就更新最高最低和收盘
                data.HighD[0] = max(data.HighD[0], bar.H)
                data.LowD[0] = min(data.LowD[0], bar.L)
                data.CloseD[0] = bar.C

            data.BarUpdate(data,bar=bar)  #传送到策略

    if stra.Backtest == "True":  # 如果是回测
        Statistics(stra,self.allInstrument)
    stra.EnableOrder = True
    #TODO 这个地方不应该盲目的注释掉  特别是下面的一条语句 stra.CurrMin 这个比较重要
    #print("orders:{0}, bars:{1}".format(len(stra.Orders), len(stra.Bars)))
    stra.Datas[0].CurrMin = lasttime  # 设置最后1分钟数据为加载数据库最后的数据
    print("最后一分钟为%s 历史数据读取并且加载完毕了." %lasttime)


#------------------------------------------------------------------------------------------------------------------------------
'''
def readloadMongoData(self,stra):
    """载入主要用于比特币 暂时废弃数据库历史数据"""
    tempdata = pymongo.MongoClient("localhost",27017)
    #collection = tempdata["VnTrader_1Min_Db"]["btc_usd"]
    #VnTrader_1Min_Db VnTrader_3Min_Db VnTrader_5Min_Db VnTrader_15Min_Db VnTrader_30Min_Db VnTrader_1hour_Db VnTrader_2hour_Db VnTrader_4hour_Db VnTrader_6hour_Db VnTrader_1day_Db VnTrader_3day_Db VnTrader_1week_Db
    #btc_usd_15min_this_week    btc_usd_15min_quarter
    symbo = ['btc_usd', 'ltc_usd', 'eth_usd', 'etc_usd', 'bch_usd']
    shijian = ['1min', '3min', '5min', '15min', '30min', '1day', '3day', '1week', '1hour', '2hour', '4hour',
               '6hour', '12hour']
    heyue = ['this_week', 'next_week', 'quarter']
    Interval = {1:'min',2:'hour',3:'day'}
    print("VnTrader_{0}{1}_Db".format(stra.Datas[0].Interval,Interval[int(stra.Datas[0].IntervalType)]))
    print("{0}_{1}{2}_quarter".format(stra.Instrument,stra.Datas[0].Interval,Interval[int(stra.Datas[0].IntervalType)]))
    collection = tempdata["VnTrader_{0}{1}_Db".format(stra.Datas[0].Interval,Interval[int(stra.Datas[0].IntervalType)])]["{0}_{1}{2}_quarter".format(stra.Instrument,stra.Datas[0].Interval,Interval[int(stra.Datas[0].IntervalType)])]
    #collection = tempdata["VnTrader_1hour_Db"]["btc_usd_1hour_quarter"]
    print('开始载入数据')
    startdate= datetime.strptime(stra.BeginDate, '%Y%m%d')
    endDate= datetime.strptime(stra.EndDate, '%Y%m%d')
    flt = {'datetime': {'$gte': startdate,
                        '$lt': endDate}}
    doc = collection.find(flt).sort('datetime')
    print("总共加载了%s" %doc.count())
    return doc
'''
#------------------------------------------------------------------------------------------------------------------------------
def readloadPkl(self, stra):
    """读取本地数据 使用PKI数据 如果本地不存在那么读取网络然后填充到本地"""
    path = 'data/{0}_{1}_{2}.pkl'.format(stra.ID, stra.BeginDate, stra.Datas[0].Instrument)
    if os.path.exists(path):
        print('策略{0} 正在从本地加载历史数据'.format(stra.ID))
        f = open(path, 'rb')
        ddoc = pkl.load(f)
    else:
        print('策略{0}首次加载 正在从网络下载并且写入本地数据'.format(stra.ID))
        ddoc = self.readnetwork(stra)
        if not os.path.exists('data/'):
            os.makedirs('data/')
        f=open(path,'wb')
        pkl.dump(ddoc,f)
    return ddoc
#-----------------------------------------------------------------------------------------------------------------------------


def readData(stra):
    """读取网络数据，截止最后1根数据"""
    print('策略{0}正从远程下载数据'.format(stra.ID))
    bars = []
    ddoc=read_bars(stra)   #海风数据
    #ddoc=read_from_zq(stra)  #中期数据  最大3000   1分钟数据

    return ddoc



# ------------------------------------------------------------------------------
def read_tick_test(self, stra):
    """
    tick 读取测试 用于测试tick撮合k线   数据来源vnpy 记录下载  调试窗口输出之后整理而来
    :param stra:
    :return:
    """
    return
    print('开始加载Tick数据%s' % stra.ID)
    self.tickStrategyDict['rb1801'] = [stra]
    ticks = []
    with open('D:\\python Project\\at_py\\at_py\\py_at\\1.txt') as f:
        for line in f:
            if (len(line) < 39):
                ticks.append(line)
    for tc in ticks:
        tick = Tick()
        tick.Instrument = 'rb1801'
        if (tc[-7:-1][0] == '格'):
            tick.LastPrice = float(tc[-6:-1])
        else:
            tick.LastPrice = float(tc[-7:-1])
        tick.OpenInterest = 0
        tick.Volume = 0

        # day = pDepthMarketData.getTradingDay()  没有理由使用交易日期
        day = '20170915'  # 应该是用发生日期  2017-9-4更改
        str = day + ' ' + tc[13:21]
        if day == None or day == ' ':
            str = time.strftime('%Y%m%d %H:%M:%S', time.localtime())
        # tick.UpdateTime = time.strptime(str, '%Y%m%d %H:%M:%S')
        tick.Strtime = str  # 字符串格式
        tick.UpdateTime = customized_parse(str)  # 工具类函数
        #self.q_Tick(tick)
        stra.on_tick(tick)